/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ufpb.halloc.comunicacao;

import br.com.ufpb.halloc.dados.DisciplinaDAOArquivoBin;
import br.com.ufpb.halloc.dados.DisciplinaDAOArquivoFactory;
import br.com.ufpb.halloc.dados.DisciplinaDAOBDFactory;
import br.com.ufpb.halloc.dados.DisciplinaDAOFactory;
import br.com.ufpb.halloc.dados.DisciplinaDAOPostgreSQL;
import br.com.ufpb.halloc.exceptions.DisciplinaDuplicadaException;
import br.com.ufpb.halloc.exceptions.DisciplinaInexistenteException;
import br.com.ufpb.halloc.exceptions.DisciplinaInvalidaException;
import br.com.ufpb.halloc.negocio.Disciplina;
import java.util.List;

/**
 *
 * @author leonardo
 */
public class GerenteCadastroDisciplina {
    
    
    private DisciplinaDAOFactory discDaoFactory;
    
    
    /* SINGLETON */
    private static GerenteCadastroDisciplina gerente;
          
    public static GerenteCadastroDisciplina getInstance(){
        if (gerente == null)
            gerente = new GerenteCadastroDisciplina();
        return gerente;
    }
    
    /* CONSTRUTOR */
    private GerenteCadastroDisciplina(){
    }
    
    /* MÉTODOS */
    public void carregarDisciplinasDoArquivoBin(){
        
        DisciplinaDAOArquivoBin arquivoDaoBin = this.getInstanceDisciplinaArquivoBin();
        arquivoDaoBin.recuperaDisciplinasDoArquivoBin();
        
    }
    
    
    public void cadastraDisciplinaArquivoBin(Disciplina disc) throws DisciplinaDuplicadaException{
        
        DisciplinaDAOArquivoBin arquivoDaoBin = this.getInstanceDisciplinaArquivoBin();
        arquivoDaoBin.inserir(disc);
        
    }
    
    // cadastra no banco de dados
    public void cadastraDisciplinaBD(Disciplina disc) throws DisciplinaInvalidaException{
        DisciplinaDAOPostgreSQL postgreDaoDisc = (DisciplinaDAOPostgreSQL) this.getInstanceDisciplinaBDPostgreSQL();
        postgreDaoDisc.inserir(disc);        
    }
    
    public Disciplina getDisciplinaIDAquivoBin(String id) throws DisciplinaInexistenteException{
        
        DisciplinaDAOArquivoBin arquivoDaoBin = this.getInstanceDisciplinaArquivoBin();
        return arquivoDaoBin.pesquisarID(id);
        
    }
    
    
    public List<Disciplina> getDisciplinaNomeAquivoBin(String nome) throws DisciplinaInexistenteException{
        
        DisciplinaDAOArquivoBin arquivoDaoBin = this.getInstanceDisciplinaArquivoBin();
        return arquivoDaoBin.pesquisar(nome);
        
    }
    
    
    public boolean removeDisciplinaIDAquivoBin(Disciplina d) throws DisciplinaInexistenteException{
        
        DisciplinaDAOArquivoBin arquivoDaoBin = this.getInstanceDisciplinaArquivoBin();
        return arquivoDaoBin.remover(d);
        
    }
    
    public boolean atualizaDisciplinaArquivoBin(Disciplina disc) throws DisciplinaInexistenteException{
        
        DisciplinaDAOArquivoBin arquivoDaoBin = this.getInstanceDisciplinaArquivoBin();
        return arquivoDaoBin.atualizar(disc);
        
    }
    
    public List<Disciplina> getDisciplinasArquivoBin(){
        DisciplinaDAOArquivoBin arquivoDaoBin = this.getInstanceDisciplinaArquivoBin();
        return arquivoDaoBin.getDisciplinas();
    }
    
    public void salvarDisciplinasCadastradasNoArquivoBin() {
        
        DisciplinaDAOArquivoBin arquivoDaoBin = this.getInstanceDisciplinaArquivoBin();
        arquivoDaoBin.salvaDisciplinasNoArquivoBin();
    }
    
    //método privado
    private DisciplinaDAOArquivoBin getInstanceDisciplinaArquivoBin(){
        
        discDaoFactory = DisciplinaDAOFactory.
                getDisciplinaDAOFactory(DisciplinaDAOFactory.FILE);        
         return (DisciplinaDAOArquivoBin) discDaoFactory.getDisciplinaDAO(DisciplinaDAOArquivoFactory.BIN);
         
    }
    
    //método privado
    private DisciplinaDAOPostgreSQL getInstanceDisciplinaBDPostgreSQL(){
        
        discDaoFactory = DisciplinaDAOFactory.getDisciplinaDAOFactory(DisciplinaDAOFactory.BD);        
        return (DisciplinaDAOPostgreSQL) discDaoFactory.getDisciplinaDAO(DisciplinaDAOBDFactory.PGSQL);
         
    }
    
    
    public Disciplina pesquisaDisciplinaPorIDNoBD(String id) throws DisciplinaInexistenteException {
        DisciplinaDAOPostgreSQL postgreDaoDisc = (DisciplinaDAOPostgreSQL) this.getInstanceDisciplinaBDPostgreSQL();
        return postgreDaoDisc.pesquisarID(id);
    }

    public List<Disciplina> pesquisaDisciplinaNomeNoBD(String nome) throws DisciplinaInexistenteException {
        DisciplinaDAOPostgreSQL postgreDaoDisc = (DisciplinaDAOPostgreSQL) this.getInstanceDisciplinaBDPostgreSQL();
        return postgreDaoDisc.pesquisar(nome);
    }

    public List<Disciplina> getDisciplinasCadastradasNoBD() {
        DisciplinaDAOPostgreSQL postgreDaoDisc = (DisciplinaDAOPostgreSQL) this.getInstanceDisciplinaBDPostgreSQL();
        return postgreDaoDisc.getTodasAsDisciplinasCadastradasNoBanco();
    }

    public boolean removerDisciplinaBD(String id) throws DisciplinaInexistenteException {
        DisciplinaDAOPostgreSQL postgreDaoDisc = (DisciplinaDAOPostgreSQL) this.getInstanceDisciplinaBDPostgreSQL();
        return postgreDaoDisc.remover(id);
    }
    
    public boolean atualizaDisciplinaBD(Disciplina disc) throws DisciplinaInexistenteException {
        DisciplinaDAOPostgreSQL postgreDaoDisc = (DisciplinaDAOPostgreSQL) this.getInstanceDisciplinaBDPostgreSQL();
        return  postgreDaoDisc.atualizar(disc);
    }
    
    
}
